package com.gxc.recursion;

/**
 * 数字字符串转化为字母字符串
 规定1和A对应、2和B对应、3和C对应...

 那么一个数字字符串比如"111"，就可以转化为"AAA"、"KA"和"AK"。

 给定一个只有数字字符组成的字符串str，返回有多少种转化结果。

 假设0到i-1的位置上已经确定，从i位置开始做转化

 如果i位置上为‘0‘，返回0，因为0没办法转化为字母
 如果i位置上为’3‘ ~ ’9‘，因为字母只有26个，只能将其转化为对应字母，接着尝试下一个位置。
 如果i位置上为’1‘ ，有两种选择：
 i自己作为单独部分，接着尝试i+1~最后
 i和i+1作为单独部分，接着尝试i+2~最后


 如果i位置上为’2‘ ，有两种选择：
 i自己作为单独部分，接着尝试i+1~最后
 如果i+1的值为’0‘ ~ ’6’，可以将i和i+1作为单独部分，接着尝试i+2~最后
 */
public class ConvertToLetterString {

    public static void main(String[] args) {
        String str = "111";
        System.out.println(convertToLetterString(str.toCharArray(), 0));
    }

    /**
     *
     * @param chars  字符数组
     * @param l 当前第几个字符
     * @return
     */
    public static int convertToLetterString(char[] chars, int l) {
        if (l == chars.length) return 1;
        if (chars[l] == '0') {
            return 0;
        }
        int sum = 0;
        if (chars[l] == '1') {
            //i自己作为单独部分，接着尝试i+1~最后
            sum = convertToLetterString(chars, l+1);
            if (l+1<chars.length) {
                // i和i+1作为单独部分，接着尝试i+2~最后
                sum +=  convertToLetterString(chars, l+2);
            }
        } else if (chars[l] == '2') {
            //i自己作为单独部分，接着尝试i+1~最后
            sum =  convertToLetterString(chars, l+1);
            if (l+1< chars.length && chars[l+1]<='6' && chars[l+1]>='0') {
                // i和i+1作为单独部分，接着尝试i+2~最后
                sum +=  convertToLetterString(chars, l+2);
            }
        }  else {
            sum += convertToLetterString(chars, l+1);
        }
        return sum;
    }


}
